package services

import (
	"fmt"
	"time"

	"cashew.com/cashew_common/constants"
	"cashew.com/cashew_common/utils"
	"github.com/beego/beego/v2/core/logs"
	"github.com/pkg/errors"
)

func TagActiveUsers(activeDuration int) error {

	activeTimeBegin := time.Now().Add(-time.Duration(activeDuration) * time.Second).Unix()

	// 获取数据库连接
	db := utils.GetDB()

	if db == nil {
		return errors.New("database connection is nil")
	}

	baseSQL := `
    SELECT 
        u.user_id, 
        u.free_chat_count, 
        up.tag  
    FROM 
        users u
    LEFT JOIN 
        user_profile up ON u.user_id = up.user_id  
    WHERE 
        u.update_time >= ? 
    ORDER BY 
        u.user_id ASC 
    LIMIT ? OFFSET ?
`

	// 分页参数
	limit := 10 // 保持与原逻辑一致
	offset := 0

	for {
		// 动态生成SQL
		rows, err := db.Query(
			baseSQL,
			activeTimeBegin,
			limit,
			offset,
		)

		if err != nil {
			logs.Error("Query error:", err)
			return err
		}
		defer rows.Close()

		// 处理结果
		hasData := false
		for rows.Next() {
			hasData = true

			var (
				userId        int64
				freeChatCount int
				tag           string
			)

			if err := rows.Scan(&userId, &freeChatCount, &tag); err != nil {
				logs.Error("Scan error:", err)
				return err
			}

			// 打印主播信息（与原逻辑一致）
			logs.Info("用户ID：%d 剩余免费聊天次数：%d", userId, freeChatCount)

			// 调用外部接口
			anchorRes, err := Queryuser(fmt.Sprintf("%d", userId))
			if err != nil {
				return err
			}

			if anchorRes.Result != 0 || anchorRes == nil {
				logs.Error("coco 接口返回 nil")
				return errors.New("coco 接口返回 nil")
			}

			// 用户标签优先级 1. 充值用户 2.新老用户 3.新用户有无免费卡

			// int 是否新注册用户, 1 是 0 否
			isNewRegUser := anchorRes.Data.IsNewRegUser

			//string 上次充值时间, 没充值过返回空字符串或"0"都可以
			lastEchargeTime := anchorRes.Data.LastRechargeTime

			newUserTag := constants.USER_TAG_OLD_USER

			if lastEchargeTime != "" && lastEchargeTime != "0" {
				// 是充值用户
				newUserTag = constants.USER_TAG_RECHARGED_USER

			} else if isNewRegUser > 0 {
				// 是新用户，判断有无免费卡
				if freeChatCount > 0 {
					// 新用户有免费卡
					newUserTag = constants.USER_TAG_NEW_WITH_FREE_CARD
				} else {
					// 新用户无免费卡
					newUserTag = constants.USER_TAG_NEW_WITHOUT_FREE_CARD
				}
			}

			logs.Info("用户ID：%d 新用户标签：%s", userId, newUserTag)

			if newUserTag != tag {
				updateSQL := `
					UPDATE 
						user_profile 
					SET 
						tag = ? 
					WHERE 
						user_id = ?`

				_, err = db.Exec(
					updateSQL,
					newUserTag,
					userId,
				)

				if err != nil {
					logs.Error("Exec error:", err)
					return err
				}

				// mq 同步用户信息
				go SyncUserData(fmt.Sprintf("%d", userId), constants.DATA_UPDATED_USER_TAG_UPDATED, nil)
			}

			logs.Info("coco 接口返回 cocoAnchor: %+v", *anchorRes)
		}

		// 检查循环终止条件
		if !hasData {
			break
		}

		// 更新offset
		offset += limit
	}

	return nil
}

func TagMaoyinActiveUsers(activeDuration int) error {

	activeTimeBegin := time.Now().Add(-time.Duration(activeDuration) * time.Second).Unix()

	// 获取数据库连接
	db := utils.GetDB()
	if db == nil {
		return errors.New("database connection is nil")
	}

	baseSQL := `
    SELECT 
        u.user_id, 
        u.free_chat_count, 
        up.tag  
    FROM 
        users u
    LEFT JOIN 
        user_profile up ON u.user_id = up.user_id  
    WHERE 
        u.update_time >= ? 
    ORDER BY 
        u.user_id ASC 
    LIMIT ? OFFSET ?
`

	// 分页参数
	limit := 10 // 保持与原逻辑一致
	offset := 0

	for {
		// 动态生成SQL
		rows, err := db.Query(
			baseSQL,
			activeTimeBegin,
			limit,
			offset,
		)

		if err != nil {
			logs.Error("Query error:", err)
			return err
		}
		defer rows.Close()

		// 处理结果
		hasData := false
		for rows.Next() {
			hasData = true

			var (
				userId        int64
				freeChatCount int
				tag           string
			)

			if err := rows.Scan(&userId, &freeChatCount, &tag); err != nil {
				logs.Error("Scan error:", err)
				return err
			}

			// 打印主播信息（与原逻辑一致）
			logs.Info("用户ID：%d 剩余免费聊天次数：%d", userId, freeChatCount)

			// 调用外部接口
			anchorRes, err := Queryuser(fmt.Sprintf("%d", userId))
			if err != nil {
				return err
			}

			if anchorRes.Result != 0 || anchorRes == nil {
				logs.Error("coco 接口返回 nil")
				return errors.New("coco 接口返回 nil")
			}

			// 用户标签优先级 1. 充值用户 2.新老用户 3.新用户有无免费卡

			// int 是否新注册用户, 1 是 0 否
			isNewRegUser := anchorRes.Data.IsNewRegUser

			//string 上次充值时间, 没充值过返回空字符串或"0"都可以
			lastEchargeTime := anchorRes.Data.LastRechargeTime

			newUserTag := constants.USER_TAG_OLD_USER

			if lastEchargeTime != "" && lastEchargeTime != "0" {
				// 是充值用户
				newUserTag = constants.USER_TAG_RECHARGED_USER

			} else if isNewRegUser > 0 {
				// 是新用户，判断有无免费卡
				if freeChatCount > 0 {
					// 新用户有免费卡
					newUserTag = constants.USER_TAG_NEW_WITH_FREE_CARD
				} else {
					// 新用户无免费卡
					newUserTag = constants.USER_TAG_NEW_WITHOUT_FREE_CARD
				}
			}

			logs.Info("用户ID：%d 新用户标签：%s", userId, newUserTag)

			if newUserTag != tag {
				updateSQL := `
					UPDATE 
						user_profile 
					SET 
						tag = ? 
					WHERE 
						user_id = ?`

				_, err = db.Exec(
					updateSQL,
					newUserTag,
					userId,
				)

				if err != nil {
					logs.Error("Exec error:", err)
					return err
				}

				// mq 同步用户信息
				go SyncUserData(fmt.Sprintf("%d", userId), constants.DATA_UPDATED_USER_TAG_UPDATED, nil)
			}

			logs.Info("coco 接口返回 cocoAnchor: %+v", *anchorRes)
		}

		// 检查循环终止条件
		if !hasData {
			break
		}

		// 更新offset
		offset += limit
	}

	return nil
}
